package com.note.feng.leetcode.algorithms.easy.eleven;

public class ThousandHundredEightyFive {
    /**
     * 1185 一周中的第几天
     * 给你一个日期，请你设计一个算法来判断它是对应一周中的哪一天。
     *
     * 输入为三个整数：day、month 和 year，分别表示日、月、年。
     *
     * 您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}。
     *
     * 示例 1：
     *
     * 输入：day = 31, month = 8, year = 2019
     * 输出："Saturday"
     * 示例 2：
     *
     * 输入：day = 18, month = 7, year = 1999
     * 输出："Sunday"
     * 示例 3：
     *
     * 输入：day = 15, month = 8, year = 1993
     * 输出："Sunday"
     *
     * 提示：
     *
     * 给出的日期一定是在 1971 到 2100 年之间的有效日期。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/day-of-the-week
     */
    /**
     * 解法：模拟
     *  通过查日历，1971年1月1日是周四，计算出给定日期到1971.1.1的天数，就可以得到周几
     *  1、计算整年的天数；
     *  2、计算月份的天数
     *  3、计算日的天数
     * @param day
     * @param month
     * @param year
     * @return
     */
    public String dayOfTheWeek(int day, int month, int year) {
        String [] week = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
        int [] monthDays = {31,28,31,30,31,30,31,31,30,31,30,31};
        int days = 0;
        for (int i = 1971; i < year; i++) {
            days += isLeapYear(i) ? 366 : 365;
        }
        for (int i = 0; i < month - 1; i++) {
            days += monthDays[i];
        }
        if(month > 2 && isLeapYear(year)){
            days ++;
        }
        return week[(days + day + 3) % 7];
    }

    private boolean isLeapYear(int year){
        return (year % 4 == 0 && year % 100 != 0)||year % 400 == 0;
    }
}
